<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0059)http://203.162.17.98/weblh/suutam/2002/vovisoft/msnet/6.htm -->
<HTML><HEAD><TITLE>Bài 5</TITLE>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
<META content="Le Hoan" name=Author>
<META content="MSHTML 5.50.4134.100" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId>
<META 
content="computer, software, games, vietnam, viet nam, tin hoc, le hoan, pclehoan, ktlehoan, vietnamese, download, saigon, freeware, lehoanpc, mailing list, may tinh, phan cung, phan mem, kien thuc, hop thu, internet, weblh, unicode, Forum, chat, diendan, dien dan" 
name=keywords>
<META 
content="Pho bien kien thuc, huong dan su dung phan cung, phan mem may tinh, game. Download software free. Link website Vietnam, forum, chat, mailing list..." 
name=description></HEAD>
<BODY>
<CENTER>
<P><A href="http://www.vovisoft.com/"><IMG height=77 alt="Logo of Vovisoft" 
src="6_files/vs-logo4_10.gif" width=102 border=0> </A><FONT face=Tahoma></P>
<H2><FONT face=Tahoma color=#800000>Bài 5</FONT></H2>
<H2><FONT face=Tahoma color=#800000>Những chức năng Đối Tượng mới của VB.NET 
(phần II)</FONT></H2></CENTER></FONT><FONT face=Arial>
<BLOCKQUOTE>
  <BLOCKQUOTE>
    <H3><FONT color=green size=2>Dùng OO trong VB.NET</FONT></H3>
    <H3><FONT color=blue size=2>Tạo một Class mới</FONT></H3>
    <H4><FONT color=#800000 size=2>Class Keyword</FONT></H4>
    <P><FONT size=2>Trong một .vb file ta có thể viết nhiều Classes, code của 
    mỗi Class nằm trong một <B>Class</B> ... <B>End Class</B> block. Thí 
    dụ:</FONT></P></FONT><FONT face=Tahoma>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Public</FONT> <FONT color=blue>Class</FONT> TheClass 
   <FONT color=blue>Public</FONT> <FONT color=blue>Sub</FONT> Greeting() 
      MessageBox.Show("Hello world", MsgBoxStyle.Information, "TheClass") 
   <FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
<FONT color=blue>End</FONT> <FONT color=blue>Class</FONT> 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P><FONT size=2>MessageBox.Show và MsgBoxStyle.Information trong VB.NET thay 
    thế MsgBox và vbInformation trong VB6. </FONT></P>
    <H4><FONT color=#800000 size=2>Classes và Namespaces</FONT></H4>
    <P><FONT size=2>Nhắc lại là .NET dùng <B>Namespace</B> để sắp đặt các 
    Classes cho thứ tự theo nhóm, loại. Namespaces được declared với một Block 
    Structure giống như sau:</FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Namespace</FONT> Vovisoft 
   <FONT color=blue>Public</FONT> <FONT color=blue>Class</FONT> TheClass 
      <FONT color=blue>Public</FONT> <FONT color=blue>Sub</FONT> Greeting() 
         MessageBox.Show("Hello world", MsgBoxStyle.Information, "TheClass") 
      <FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
   <FONT color=blue>End</FONT> <FONT color=blue>Class</FONT> 
<FONT color=blue>End</FONT> <FONT color=blue>Namespace</FONT> 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>Muốn nói đến bất cứ Class, Structure, hay thứ gì được declared bên trong 
    một <B>Namespace...End Namespace</B> block ta phải dùng tên Namespace trước. 
    Thí dụ:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Private</FONT> myObject <FONT color=blue>As</FONT> Vovisoft.TheClass
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>Một source file có thể chứa nhiều Namespaces, và bên trong mỗi Namespace 
    lại có thể có nhiều Classes.<BR><BR>Ngoài ra, Classes thuộc về cùng một 
    Namespace có thể nằm trong nhiều files khác nhau trong một VB.NET 
    project.<BR><BR>Thí dụ ta có một source file với code như 
sau:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Namespace</FONT> Vovisoft 
   <FONT color=blue>Public</FONT> <FONT color=blue>Class</FONT> TheClass 
   <FONT color=green>' Code</FONT>
   <FONT color=blue>End</FONT> <FONT color=blue>Class</FONT> 
<FONT color=blue>End</FONT> <FONT color=blue>Namespace</FONT> 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>Và một source file khác trong cùng project với code:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Namespace</FONT> Vovisoft 
   <FONT color=blue>Public</FONT> <FONT color=blue>Class</FONT> TheOtherClass 
   <FONT color=green>' Code</FONT>
   <FONT color=blue>End</FONT> <FONT color=blue>Class</FONT> 
<FONT color=blue>End</FONT> <FONT color=blue>Namespace</FONT> 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>Vậy thì trong Namespace <B>Vovisoft</B> ta có hai Classes <B>TheClass</B> 
    và <B>TheOtherClass</B>.<BR><BR>Nhớ là, by default, <B>Root Namespace</B> 
    của một VB.NET project là tên của project ấy. Khi ta dùng Namespace block 
    structure là chúng ta đang thêm một tầng tên vào Root Namespace. Do đó, 
    trong thí dụ trên nếu tên project là <B>MyProject</B> thì, từ bên ngoài 
    project ấy, ta có thể declare một variable như sau:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Private</FONT> myObject <FONT color=blue>As</FONT> MyProject.Vovisoft.TheClass
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <H4><FONT color=#800000 size=2>Tạo ra Methods</FONT></H4>
    <P><B><FONT size=2>Methods</FONT></B><FONT size=2> trong VB.NET có hai thứ: 
    <B>Sub</B> và <B>Function</B>. Function thì phải <B>return</B> một kết quả. 
    By default, parameters của Method là <B>ByVal</B> chớ không phải 
    <B>ByRef</B>. Tức là nếu muốn parameter nào ByRef thì phải nhớ khai ra rõ 
    ràng.<BR><BR>Nhắc lại là khi một variable được passed vào trong một method 
    bằng <B>ByVal</B> thì system cho method đó một copy (bản sao) của variable, 
    do đó, trị số của variable không bị thay đổi bởi công tác của method. Ngược 
    lại, nếu một variable được passed vào trong một method bằng <B>ByRef</B> thì 
    method dùng chính variable đó, do đó, trị số của variable có thể bị thay đổi 
    bởi công tác của method.<BR><BR>Ta có thể giới hạn việc sử dụng một method 
    bằng cách áp đặt một <B>Access Modifier</B> (sửa đổi quyền truy nhập) hay 
    còn gọi là <B>Scoping keyword</B> (phạm vi hoạt động): </FONT></P>
    <UL>
      <LI><B><FONT size=2>Private</FONT></B><FONT size=2> - chỉ cho phép code 
      trong cùng Class được gọi. </FONT>
      <LI><B><FONT size=2>Friend</FONT></B><FONT size=2> - chỉ cho phép code 
      trong cùng project/component được gọi. </FONT>
      <LI><B><FONT size=2>Public</FONT></B><FONT size=2> - cho phép ai gọi cũng 
      được. </FONT>
      <LI><B><FONT size=2>Protected</FONT></B><FONT size=2> - cho phép code 
      trong subclasses (classes con, cháu) được gọi. </FONT>
      <LI><B><FONT size=2>Protected Friend</FONT></B><FONT size=2> - cho phép 
      code trong cùng project/component hay code trong subclasses được gọi. 
      </FONT></LI></UL>
    <H4><FONT color=#800000 size=2>Tạo ra Properties</FONT></H4>
    <P><FONT size=2>Trong VB.NET ta chỉ dùng một routine duy nhất cho mỗi 
    Property, với hai chữ <B>Get</B> và <B>Set</B> như sau (không còn dùng chữ 
    <B>Let</B> của VB6 nữa):</FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Private</FONT> mdescription <FONT color=blue>As</FONT> <FONT color=blue>String</FONT> 
<FONT color=blue>Public</FONT> <FONT color=blue>Property</FONT> Description() <FONT color=blue>As</FONT> <FONT color=blue>String</FONT> 
   <FONT color=blue>Set</FONT>  (<FONT color=blue>ByVal</FONT> Value <FONT color=blue>As String</FONT>) 
      mdescription = Value 
   <FONT color=blue>End</FONT> <FONT color=blue>Set</FONT> 
   <FONT color=blue>Get </FONT>
      Description = mdescription 
   <FONT color=blue>End</FONT> <FONT color=blue>Get </FONT>
<FONT color=blue>End</FONT> <FONT color=blue>Property</FONT> 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <H4><FONT color=#800000 size=2>ReadOnly và WriteOnly property</FONT></H4>
    <P><FONT size=2>Bây giờ nếu Property là ReadOnly ta sẽ lấy phần Set ra và 
    viết:</FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Public ReadOnly Property</FONT> Age() <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> 
<FONT color=blue>   Get</FONT> 
      Age = 3 
<FONT color=blue>   End</FONT> <FONT color=blue>Get</FONT> 
<FONT color=blue>End</FONT> <FONT color=blue>Property</FONT> 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>hay WriteOnly ta sẽ ấy phần Get ra và viết:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Private</FONT> _data <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> 
<FONT color=blue>Public WriteOnly Property</FONT> Data() <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> 
<FONT color=blue>   Set</FONT> (<FONT color=blue>ByVal</FONT> Value <FONT color=blue>As Integer</FONT>) 
      _data = Value 
<FONT color=blue>   End</FONT> <FONT color=blue>Set</FONT> 
<FONT color=blue>End</FONT> <FONT color=blue>Property</FONT> 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <H4><FONT color=#800000 size=2>Default Properties</FONT></H4>
    <P><B><FONT size=2>Default Property</FONT></B><FONT size=2> là property của 
    Object mà program dùng khi ta chỉ cho tên của Object và không nói rõ 
    property nào. Thí dụ trong VB6 khi ta code:</FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial>TextBox1 = "The house of rising sun"
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>VB6 hiểu rằng ta muốn dùng Default Property <B>text</B> của Textbox1 nên 
    code ấy tương đương với:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial>TextBox1.text = "The house of rising sun"
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>Trong VB6 khi ta dùng keyword <B>Set</B> với tên của Object, thí dụ 
    như:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial>     <FONT color=blue>Dim</FONT> myTextBox <FONT color=blue>As</FONT> Textbox
     <FONT color=blue>Set</FONT> myTextBox = TextBox1
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>program sẽ hiểu là ta muốn nói đến chính Object myTextBox . Nếu không thì 
    nó biết ta muốn nói đến Object Default Property mà làm biếng code cho rõ 
    ra.<BR><BR>Trong VB.NET Default Property phải là một <B>Property array</B>. 
    Một Property array là một property được <B>Indexed</B> (nói đến từng Item 
    bằng con số Index) giống như một array. Lý do chính của sự bắt buộc nầy là 
    để khỏi lẫn lộn giữa hai trường hợp ta nói đến <I><B>Default property</B> 
    của một Object</I> hay <I><B>chính Object ấy</B></I>, vì trong VB.NET ta 
    không còn dùng <B>Set</B> keyword cho Object assignment nữa (ta chỉ còn dùng 
    keyword Set trong Property mà thôi).<BR><BR>Bây giờ hễ muốn nói đến Default 
    Property của Object thì phải dùng Index. Thí dụ để nói đến chính Object, ta 
    code:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial>myValue = myObject 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>để nói đến Default Property Item 3 của Object, ta code:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial>myValue = myObject(3) 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>Sự thay đổi từ VB6 nầy có nghĩa là một property array procedure phải nhận 
    một parameter. Thí dụ:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Private</FONT> theData(100) <FONT color=blue>As</FONT> <FONT color=blue>String</FONT> 
<FONT color=blue>Default</FONT> <FONT color=blue>Public</FONT> <FONT color=blue>Property</FONT> Data(<FONT color=blue>ByVal</FONT> Index <FONT color=blue>As</FONT> Integer) <FONT color=blue>As</FONT> <FONT color=blue>String</FONT> 
   <FONT color=blue>Get</FONT> 
      Data = theData(Index) 
   <FONT color=blue>End</FONT> <FONT color=blue>Get</FONT> 
   <FONT color=blue>Set</FONT>(<FONT color=blue>ByVal</FONT> Value <FONT color=blue>As</FONT> String) 
      theData(Index) = Value 
   <FONT color=blue>End</FONT> <FONT color=blue>Set</FONT> 
<FONT color=blue>End</FONT> <FONT color=blue>Property</FONT> 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>Từ nay ta không thể code:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial>TextBox1 = "Good morning!"
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>như trong VB6 được nữa, mà phải code:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial>TextBox1.text = "Good morning!"
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P><FONT size=2>Vì Property Text không còn là Default Property của TextBox. 
    </FONT></P>
    <H3><FONT color=blue size=2>Overloading methods</FONT></H3>
    <P><FONT size=2>Một trong những chức năng đa diện (Polymorphism) hùng mạnh 
    nhất của VB.NET là <B>overload</B> (quá tải, có rồi mà còn cho thêm) một 
    method. Overloading có nghĩa là ta có thể dùng cùng một tên cho nhiều 
    methods - miễn là chúng có danh sách các parameters khác nhau, hoặc là 
    parameter dùng data type khác nhau (td: method nầy dùng Integer, method kia 
    dùng String), hoặc là số parameters khác nhau (td: method nầy có 2 
    parameters, method kia có 3 parameters).<BR><BR>Overloading không thể được 
    thực hiện chỉ bằng cách thay đổi <I><B>data type của Return value của 
    Function</B></I>. Phải có parameter list khác nhau mới được.<BR><BR>Dưới đây 
    là thí dụ ta dùng Overloading để code hai Functions tìm data, một cái cho 
    String, một cái cho Integer:</FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Public</FONT> <FONT color=blue>Function</FONT> FindData(<FONT color=blue>ByVal</FONT> Name <FONT color=blue>As</FONT> String) <FONT color=blue>As</FONT> ArrayList 
   <FONT color=green>' find data and return result</FONT>
<FONT color=blue>End</FONT> <FONT color=blue>Function</FONT> <BR>
<FONT color=blue>Friend</FONT> <FONT color=blue>Function</FONT> FindData(<FONT color=blue>ByVal</FONT> Age <FONT color=blue>As</FONT> Integer) <FONT color=blue>As</FONT> ArrayList 
   <FONT color=green>' find data and return result</FONT>
<FONT color=blue>End</FONT> <FONT color=blue>Function</FONT> 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P><FONT size=2>Để ý là ta có thể cho mỗi overloading Function một phạm vi 
    hoạt động (Scope on implementation) khác nhau. Trong thí dụ trên ta dùng 
    Access Modifier <B>Public</B> cho Function đầu và <B>Friend</B> cho Function 
    sau.</FONT></P>
    <H3><FONT color=blue size=2>Object Lifecycle</FONT></H3>
    <P><B><FONT size=2>Object Lifecycle</FONT></B><FONT size=2> (cuộc đời của 
    Object) được dùng để nói đến khi nào Object bắt đầu hiện hữu và khi nào nó 
    không còn nữa. Sở dĩ ta cần biết rõ cuộc đời của một Object bắt đầu và chấm 
    dứt lúc nào là để tránh dùng nó khi nó không hiện hữu, tức là chưa ra đời 
    hay đã khuất bóng rồi. </FONT></P>
    <H4><FONT color=#800000 size=2>New method</FONT></H4>
    <P><FONT size=2>Trong VB6, khi một Object thành hình thì <B>Sub 
    Class_Initialize</B> được executed. Tương đương như vậy, trong VB.NET ta có 
    <B>Sub New()</B>, gọi là <B>Constructor</B>. VB.NET bảo đảm Sub New() sẽ 
    được CLR gọi khi Object được instantiated và nó chạy trước bất cứ code nào 
    trong Object.<BR><BR>Nếu Sub Class_Initialize của một Class Object trong VB6 
    không nhận parameter thì Sub New() trong VB.NET chẳng những có nhận 
    parameters mà còn cho phép ta nhiều cách để gọi nó. Sự khác biệt trong 
    Constructors của VB6 và VB.NET rất quan trọng.<BR><BR>Tưởng tượng ta có một 
    <B>Khuôn làm bánh bông lan</B>; khuôn là Class còn những bánh làm ra từ 
    khuôn sẽ là các Objects bánh bông lan. Nếu ta muốn làm một cái bánh bông lan 
    với một lớp sô-cô-la trên mặt thì công tác sẽ gồm có hai bước: </FONT></P>
    <OL>
      <LI><FONT size=2>Dùng khuôn (Class) nướng một cái Object bánh bông lan 
      (dùng <B>Sub Class_Initialize</B>) </FONT>
      <LI><FONT size=2>Đổ lên mặt bánh một lớp sô-cô-la (dùng class <B>Public 
      Sub ThoaSôcôla</B>) </FONT></LI></OL>
    <P><FONT size=2>Đến đây, mọi chuyên tương đối ổn thỏa. Bây giờ, nếu khách 
    hàng muốn một cái bánh bông lan dùng trứng vịt thay vì trứng gà thì ta chịu 
    thua thôi, vì không có cách nào bảo Sub Class_Initialize dùng trứng vịt thay 
    vì trứng gà ngay trong lúc đang tạo dựng ra Object bánh bông lan.<BR><BR>Sub 
    New() trong VB.NET có thể nhận parameters nên nó có thể nhận chỉ thị để dùng 
    trứng vịt ngay trong lúc nướng cái Object bánh bông lan.<BR><BR>Cái dạng đơn 
    giản nhất của Sub New() mà ta có thể dùng là không pass parameter nào cả 
    (trong trường hợp nầy thì giống như Sub Class_Initialize của VB6). Ta code 
    Sub New() trong Class như sau:</FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Public Class</FONT> BanhBongLan 
   <FONT color=blue>Public</FONT> <FONT color=blue>Sub</FONT> New() 
      <FONT color=green>' Code to initialise object here</FONT>
   <FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
<FONT color=blue>End</FONT> <FONT color=blue>Class</FONT>
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>Ta instantiate một Object bánh bông lan như sau:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Dim</FONT> myBanhBongLan <FONT color=blue>As</FONT> <FONT color=blue>New</FONT> BanhBongLan() 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>Để cho Users có sự lựa chọn khi instantiate Object, ta có thể code thêm 
    những Sub New khác, mỗi Sub dùng một danh sách parameter khác nhau. Thí 
    dụ:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Public Class</FONT> BanhBongLan 
   <FONT color=blue>Public</FONT> <FONT color=blue>Sub</FONT> New() 
      <FONT color=green>' Code to initialise object here</FONT>
   <FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
 </FONT><TABLE bgColor=#f6f6f6><TBODY><TR><TD><FONT size=3><PRE><FONT face=Arial>   <FONT color=blue>Public</FONT> <FONT color=blue>Sub</FONT> New(<FONT color=blue>ByVal</FONT> LoaiTrung <FONT color=blue>As</FONT> String) 
      <FONT color=blue>Select</FONT> <FONT color=blue>Case</FONT> LoaiTrung 
      <FONT color=blue>Case</FONT> "Vit" 
         <FONT color=green>' Code for TrứngVịt here</FONT>
      <FONT color=blue>Case</FONT> "Ga" 
         <FONT color=green>' Code for TrứngGà here</FONT>
      <FONT color=blue>End</FONT> <FONT color=blue>Select</FONT> 
   <FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE>
<FONT face=Arial><FONT color=blue>End</FONT> <FONT color=blue>Class</FONT>
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>Dùng cùng một tên method để implement nhiều methods khác nhau được gọi là 
    <B>overload</B>. Đó là một trường hợp đa dạng (polymorphism) của OO 
    programming. Trong thí dụ trên nếu <B>TrứngVịt</B> và <B>TrứngGà</B> là hai 
    loại Data Types khác nhau thì ta cũng có thể dùng:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial>    <FONT color=blue>Sub New</FONT> (<FONT color=blue>ByVal</FONT> TrứngVịt <FONT color=blue>As</FONT> TrứngVịtDataType)
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>để instantiate bánh TrứngVịt và <BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial>    <FONT color=blue>Sub New</FONT> (<FONT color=blue>ByVal</FONT> TrứngGà <FONT color=blue>As</FONT> TrứngGàDataType)
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P><FONT size=2>để instantiate bánh TrứngGà.<BR><BR>Như thế ta khỏi bận tâm 
    với <B>Select Case LoaiTrung</B> khi chỉ dùng một Sub New duy nhất với 1 
    parameter.<BR><BR>Trong VisualStudio.NET, khi ta dùng tên của một overloaded 
    method, <B>IntelliSense</B> sẽ hiển thị để hướng dẫn ta đánh vào parameter 
    list khác nhau tùy theo method ta chọn. </FONT></P>
    <H4><FONT color=#800000 size=2>Termination</FONT></H4>
    <P><FONT size=2>Trong VB6 một Object sẽ bị huỷ diệt khi cái reference (chỗ 
    dùng đến Object) cuối cùng bị lấy đi. Tức là khi không có code nào khác dùng 
    Object nữa thì Object sẽ bị tự động huỷ diệt. System giữ một counter để đếm 
    số clients đang dùng Object. Cách nầy hay ở chỗ khi counter trở thành 0 thì 
    Object bị huỷ diệt ngay. Ta nói nó có <B>deterministic finalization</B>, 
    nghĩa là ta biết rõ ràng khi nào Object biến mất.<BR><BR>Tuy nhiên, nếu ta 
    có hai Object dùng lẫn nhau (gọi là <B>circular references</B>), thì ngay cả 
    đến lúc chúng không còn hoạt động nữa, chúng vẫn hiện hữu mãi trong bộ nhớ 
    vì cái Reference counter của cả hai Objects không bao giờ trở thành 0. Nếu 
    trường hợp nầy xảy ra thường lần lần system không còn memory nữa, ta gọi đó 
    là <B>memory leak (bị rỉ bộ nhớ)</B> .<BR><BR>.NET dùng phương pháp khác để 
    quản lý chuyện nầy. Cứ mỗi chốc, một program sẽ chạy để kiểm xem có Object 
    nào không còn reference nữa để huỷ diệt. Ta gọi đó là <B>Garbage Collection 
    (nhặt rác)</B>. Ngay cả trường hợp hai Objects có circular references nhưng 
    nếu không có code nào khác reference một trong hai Objects thì chúng cũng sẽ 
    được huỷ diệt. Có điều, công tác nhặt rác chạy in the background (phía sau 
    hậu trường) với ưu tiên thấp, khi CPU rảnh rang, nên ta không biết chắc một 
    Object sẽ bị hủy diệt đến bao giờ mới thật sự biến mất. Ta nói nó có 
    <B>nondeterministic finalization</B>.<BR><BR>Ta có thể ép CLR nhặt rác lập 
    tức bằng code:</FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial>   System.GC.Collect()
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P><FONT size=2>Tuy nhiên, ta chỉ làm việc ấy khi kẹt quá thôi. Tốt hơn, ta 
    duyệt lại design của mình để cho phép các Objects hết xài có thể ngồi chơi 
    trong bộ nhớ chờ đến lúc được hủy diệt. </FONT></P>
    <H4><FONT color=#800000 size=2>Dùng Dispose Method</FONT></H4>
    <P><FONT size=2>Nếu ta có một Object dùng nhiều tài nguyên (resources) như 
    bộ nhớ, database connection, file handle,.v.v. và ta cần phải thả các tài 
    nguyên ra ngay sau khi Object không còn hoạt động nữa, ta cần implement một 
    <B>Interface</B> tên <B>IDisposable</B> với <B>Implements keyword</B> như 
    sau:</FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Public</FONT> <FONT color=blue>Class</FONT> TheClass 
<FONT color=blue>Implements</FONT> IDisposable 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>Bạn phải viết code cho Sub Dispose giống như sau:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> Dispose() <FONT color=blue>Implements</FONT> IDisposable.Dispose 
  <FONT color=green>' Viết clean up code ở đây để thả các tài nguyên ra </FONT>
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>Sau đó bạn vẫn phải viết code cho Client để nó gọi Dispose Method trong 
    IDisposable interface. Bạn cần phải dùng <B>CType</B> để cast Object Class 
    khi gọi Dispose.<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Dim</FONT> objObject <FONT color=blue>As</FONT> <FONT color=blue>New</FONT> TheClass() 
<FONT color=blue>CType</FONT> (objObject, IDisposable).Dispose() 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>Để lấy đi Reference đến một Object (gọi là <B>Dereference Object</B>) bạn 
    có thể dùng:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial>     myObject = Nothing
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P><FONT size=2>Để ý là ta không có dùng keyword Set như trong VB6. Nhớ là 
    sau khi statement trên được executed thì myObject không biến mất ngay nhưng 
    nó đợi Garbage Collector đến giải quyết. </FONT></P>
    <H3><FONT color=blue size=2>Thừa kế</FONT></H3>
    <P><B><FONT size=2>Thừa kế (Inheritance)</FONT></B><FONT size=2> là khả năng 
    của một Class đạt được <B>interface</B> (giao diện) và <B>behaviours</B> 
    (tánh tình) của một Class có sẵn. Cái quá trình để làm nên việc ấy được gọi 
    là <B>Subclassing</B>. Khi ta tạo ra một Class mới thừa kế cả interface lẫn 
    behaviours từ một Class có sẵn là chúng ta đã tạo ra một <B>subclass</B> của 
    Class nguyên thủy. Người ta nói đó là một mối liên hệ <B>is-a</B> (là một), 
    ý nói Class mới <B>là một</B> loại Class nguyên thủy.<BR><BR>Ta phân biệt 
    mối liên hệ <B>is-a</B> với mối liên hệ <B>has-a</B> (có một). Trong mối 
    liên hệ has-a, Object chủ có thể làm chủ một hay nhiều Objects tớ, nhưng 
    Object tớ là một loại có thể hoàn toàn khác với Object chủ.<BR><BR>Để biểu 
    diễn đặc tính Inheritance ta hãy xét trường hợp một công ty cung cấp <B>Sản 
    phẩm</B> và <B>Dịch vụ</B>. Ta có thể code một Class cho Sản phẩm 
    (<B>ProductLine</B>) và một Class cho Dịch vụ (<B>ServiceLine</B>) , riêng 
    rẽ nhau. Nhưng vì thấy chúng có nhiều điểm tương đồng nên ta sẽ code một 
    Class gọi là Món hàng (<B>LineItem</B>), rồi inherit từ LineItem ra 
    ProductLine và ServiceLine.<BR><BR>LineItem có các properties ID, Item, 
    Price (giá) và Quantity (số lượng). Nó cũng có một Public Function để cho 
    Amount (số tiền).</FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Public</FONT> <FONT color=blue>Class</FONT> LineItem 
   <FONT color=blue>Private</FONT> mintID <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> 
   <FONT color=blue>Private</FONT> mstrItem <FONT color=blue>As</FONT> <FONT color=blue>String</FONT> 
   <FONT color=blue>Private</FONT> msngPrice <FONT color=blue>As</FONT> <FONT color=blue>Single</FONT> 
   <FONT color=blue>Private</FONT> mintQuantity <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> 

   <FONT color=blue>Public</FONT> <FONT color=blue>Property</FONT> ID() <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> 
      <FONT color=blue>Get</FONT> 
         <FONT color=blue>Return</FONT> mintID 
      <FONT color=blue>End</FONT> <FONT color=blue>Get</FONT> 
      <FONT color=blue>Set</FONT> (<FONT color=blue>ByVal</FONT> Value <FONT color=blue>As</FONT> Integer) 
         mintID = Value 
      <FONT color=blue>End</FONT> <FONT color=blue>Set</FONT> 
   <FONT color=blue>End</FONT> <FONT color=blue>Property</FONT> 

   <FONT color=blue>Public</FONT> <FONT color=blue>Property</FONT> Item() <FONT color=blue>As</FONT> <FONT color=blue>String</FONT> 
      <FONT color=blue>Get</FONT> 
         <FONT color=blue>Return</FONT> mstrItem 
      <FONT color=blue>End</FONT> <FONT color=blue>Get</FONT> 
      <FONT color=blue>Set</FONT> (<FONT color=blue>ByVal</FONT> Value <FONT color=blue>As</FONT> String) 
         mstrItem = Value 
      <FONT color=blue>End</FONT> <FONT color=blue>Set</FONT> 
   <FONT color=blue>End</FONT> <FONT color=blue>Property</FONT> 

   <FONT color=blue>Public</FONT> <FONT color=blue>Property</FONT> Price() <FONT color=blue>As</FONT> <FONT color=blue>Single</FONT> 
      <FONT color=blue>Get</FONT> 
         <FONT color=blue>Return</FONT> msngPrice 
      <FONT color=blue>End</FONT> <FONT color=blue>Get</FONT> 
      <FONT color=blue>Set</FONT> (<FONT color=blue>ByVal</FONT> Value <FONT color=blue>As</FONT> Single) 
         msngPrice = Value 
      <FONT color=blue>End</FONT> <FONT color=blue>Set</FONT> 
   <FONT color=blue>End</FONT> <FONT color=blue>Property</FONT> 

   <FONT color=blue>Public</FONT> <FONT color=blue>Property</FONT> Quantity() <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> 
      <FONT color=blue>Get</FONT> 
         <FONT color=blue>Return</FONT> mintQuantity 
      <FONT color=blue>End</FONT> <FONT color=blue>Get</FONT> 
      <FONT color=blue>Set</FONT> (<FONT color=blue>ByVal</FONT> Value <FONT color=blue>As</FONT> Integer) 
         mintQuantity = Value 
      <FONT color=blue>End</FONT> <FONT color=blue>Set</FONT> 
   <FONT color=blue>End</FONT> <FONT color=blue>Property</FONT> 

   <FONT color=blue>Public</FONT> <FONT color=blue>Function</FONT> Amount() <FONT color=blue>As</FONT> <FONT color=blue>Single</FONT> 
      <FONT color=blue>Return</FONT> mintQuantity * msngPrice 
   <FONT color=blue>End</FONT> <FONT color=blue>Function</FONT> 

<FONT color=blue>End</FONT> <FONT color=blue>Class</FONT> 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>Để tạo Class ProductLine từ Class LineItem ta phải dùng <B>Inherits</B> 
    keyword. Mỗi Object ProductLine <B>là một</B> Object LineItem với ProductID 
    và Description. <B>ProductID</B> của ProductLine được pass vào Sub New lúc 
    instantiate Object ProductLine. Còn Description là một ReadOnly property của 
    ProductLine. Ta có thể code Class ProductLine như sau:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Public</FONT> <FONT color=blue>Class</FONT> ProductLine 
   <FONT color=blue>Inherits</FONT> LineItem 

   <FONT color=blue>Private</FONT> mstrDescription <FONT color=blue>As</FONT> <FONT color=blue>String</FONT> 

   <FONT color=blue>Public</FONT> <FONT color=blue>ReadOnly</FONT> <FONT color=blue>Property</FONT> Description() <FONT color=blue>As</FONT> <FONT color=blue>String</FONT> 
      <FONT color=blue>Get</FONT> 
         <FONT color=blue>Return</FONT> mstrDescription 
      <FONT color=blue>End</FONT> <FONT color=blue>Get</FONT> 
   <FONT color=blue>End</FONT> <FONT color=blue>Property</FONT> 

   <FONT color=blue>Public</FONT> <FONT color=blue>Sub</FONT> New(<FONT color=blue>ByVal</FONT> ProductID <FONT color=blue>As</FONT> String) 
      Item = ProductID 
      mstrDescription = "No description yet" <FONT color=green>' Default description</FONT>
     <FONT color=green>' Viết code ở đây để đọc chi tiết của Product từ Database</FONT>
     <FONT color=green>' trong đó có thể có Description của Product</FONT>
   <FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
<FONT color=blue>End</FONT> <FONT color=blue>Class</FONT> 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>Statement <B>Inherits LineItem</B> khiến ProductLine thừa kế mọi 
    interface và behaviours của LineItem. Do đó ta có thể code một <B>Sub 
    BtnProduct_Click</B> để hiển thị chi tiết của ProductLine trong một Listbox 
    như sau:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Protected</FONT> <FONT color=blue>Sub</FONT> BtnProduct_Click(<FONT color=blue>ByVal</FONT> sender <FONT color=blue>As</FONT> System.Object, <FONT color=blue>ByVal</FONT> e <FONT color=blue>As</FONT> System.EventArgs) <FONT color=blue>Handles</FONT> BtnProduct.Click 
   <FONT color=blue>Dim</FONT> pl <FONT color=blue>As</FONT> ProductLine 
   pl = <FONT color=blue>New</FONT> ProductLine("P1234") 
   ListBox1.Items.Add("ProductItem:" &amp; pl.Item) 
   ListBox1.Items.Add("Description: $" &amp; pl.Description) 
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P>Trong code bên trên ta dùng cả property Item của Class LineItem lẫn 
    property Description của Class ProductLine. Cả hai đều là property của 
    ProductLine vì nó là một SubClass của LineItem.<BR><BR>Giống như vậy, một 
    ServiceLine có thể có ghi ngày giờ cung cấp service. Ta code Class 
    ServiceLine như sau:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT face=Arial><FONT color=blue>Public</FONT> <FONT color=blue>Class</FONT> ServiceLine 
   <FONT color=blue>Inherits</FONT> LineItem 

   <FONT color=blue>Private</FONT> mdtDateProvided <FONT color=blue>As</FONT> <FONT color=blue>Date</FONT> 

   <FONT color=blue>Public</FONT> <FONT color=blue>Sub</FONT> New() 
     <FONT color=green>' Make 1 as default number of services of this kind for invoice</FONT>
      Quantity = 1 
   <FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 

   <FONT color=blue>Public</FONT> <FONT color=blue>Property</FONT> DateProvided() <FONT color=blue>As</FONT> <FONT color=blue>Date</FONT> 
      <FONT color=blue>Get</FONT> 
         <FONT color=blue>Return</FONT> mdtDateProvided 
      <FONT color=blue>End</FONT> <FONT color=blue>Get</FONT> 
      <FONT color=blue>Set</FONT> (<FONT color=blue>ByVal</FONT> Value <FONT color=blue>As Date</FONT>) 
         mdtDateProvided = Value 
      <FONT color=blue>End</FONT> <FONT color=blue>Set</FONT> 
   <FONT color=blue>End</FONT> <FONT color=blue>Property</FONT> 

<FONT color=blue>End</FONT> <FONT color=blue>Class</FONT> 
</FONT></PRE></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P><FONT size=2>Một lần nữa ta dùng Statement Inherits để nói rằng 
    ServiceLine là một SubClass của LineItem. Ta thêm property 
    <B>DateProvided</B> vào interface thừa kế từ Class LineItem.<BR><BR>Bạn có 
    thể <A href="http://www.vovisoft.com/dotNET/Bai05/Inheritance.zip">Download 
    source code</A> của program nầy tại đây.</FONT></P></FONT></FONT><!-- Start of bottom bar for copyright notice etc -->
    <TABLE class=clsNavLinks id=tblFooterLinks cellSpacing=0 cellPadding=0 
    width="100%" border=0>
      <TBODY>
      <TR>
        <TD class=clsRaised width=785 bgColor=#6699cc colSpan=5>
          <P align=center><FONT face=Arial color=#ffffff size=2>Vovisoft © 2000. 
          All rights reserved.</FONT></P></TD></TR>
      <TR>
        <TD width=256>
          <P align=center><FONT face=Arial size=2>&nbsp;&nbsp; Last Updated: <!--webbot 
      bot="Timestamp" S-Type="REGENERATED" S-Format="%d %b %Y" startspan -->06 
          th3 2002<!--webbot 
      bot="Timestamp" endspan i-checksum="13300" --> </FONT></P></TD>
        <TD width=181><FONT face=Arial size=2>&nbsp;</FONT></TD>
        <TD width=258>
          <P align=center><FONT face=Arial size=2><A 
          href="mailto:dixon@vovisoft.com">Webmaster</A></FONT></P></TD></TR></TBODY></TABLE></BLOCKQUOTE></BLOCKQUOTE>
<HR>

<P align=center><FONT face="Times New Roman"><B><FONT color=#ff0000>PcLeHoan 
1996 - 2002</FONT><FONT face=.VnTime size=2><BR></FONT></B></FONT><FONT 
face="Times New Roman" size=2><B>Mirror </B>: <A 
href="http://www.pclehoan.com/andi/ndc.htm">http://www.pclehoan.com/andi/ndc.htm</A><BR><B>Mirror 
</B>: <A 
href="http://www.lehoanpc.net/andi/ndc.htm">http://www.lehoanpc.net/andi/ndc.htm</A></FONT><BR><FONT 
face="Times New Roman" size=2><B>Mirror </B>: <A 
href="http://www.ktlehoan.com/">http://www.ktlehoan.com/</A></FONT></P>
<P align=center><A target=_top 
href="http://member.bcentral.com/cgi-bin/fc/fastcounter-login?2828564"><IMG 
src="6_files/digits.gif" border=0></A> </P></BODY></HTML>
